package fiuba.algo3.mundo;

import fiuba.algo3.GeneradorAleatorio;
import fiuba.algo3.Pista;
import fiuba.algo3.XMLProcessor.nucleo.Nodo;
import fiuba.algo3.XMLProcessor.nucleo.NodoXML;
import fiuba.algo3.lugar.Lugar;
import fiuba.algo3.lugar.LugarBalazo;
import fiuba.algo3.lugar.LugarCuchillazo;
import fiuba.algo3.lugar.LugarDelSospechoso;
import fiuba.algo3.lugar.LugarFueraRutaDeEscape;
import fiuba.algo3.lugar.LugarRutaDeEscape;
import fiuba.algo3.motor.ConsultorPistas;
import fiuba.algo3.persistencia.ConstructorPais;
import fiuba.algo3.persistencia.XMLConstruible;
import java.util.ArrayList;
import java.util.List;

public class Pais implements XMLConstruible
{
	private final Posicion posicion;
	private String nombre;
	
	private Lugar lugarEconomia;
	private Lugar lugarViajes;
	private Lugar biblioteca;
	//Estos 3 no son necesarios nodalizarlos ya que se van a asignar los lugares al principio de cada partida

	public Pais(Posicion posicion)
	{
		this.posicion = posicion;
	}

	public Pais(Posicion posicion, String nombre)
	{
		this.posicion = posicion;
		this.nombre = nombre;
	}
	public String obtenerNombre()
	{
		return this.nombre;
	}

	public float calcularDistancia(Posicion posicion)
	{
		return posicion.calcularDistancia(this.posicion);
	}

	public float calcularDistancia(Pais pais)
	{
		return pais.calcularDistancia(this.posicion);
	}

	public boolean esElMismoQue(Pais pais)
	{		
		return (this.obtenerNombre().equals(pais.obtenerNombre()));
	}

	public Pais construir(NodoXML nodo)
	{
		return ConstructorPais.construir(nodo);
	}

	public NodoXML nodalizar()
	{
		Nodo nodoRaiz = new Nodo("objeto");
//		nodoRaiz.setAttribute("clase", ConstructorPais.CLASE);
//		nodoRaiz.appendChild(fabricaDeNodos.nuevoNodoCampoPrimitivo("nombre", this.nombre));
//		nodoRaiz.appendChild(fabricaDeNodos.nuevoNodoCampo("posicion", this.posicion.nodalizar(fabricaDeNodos)));
		return nodoRaiz;
	}

	public Lugar obtenerLugarEconomia() {
		return lugarEconomia;
	}
	
	public Lugar obtenerLugarViajes() {
		return lugarViajes;
	}
	
	public Lugar obtenerBiblioteca() {
		return biblioteca;
	}

	public void asignarLugaresSinInformacion() {
		this.lugarEconomia = new LugarFueraRutaDeEscape();
		this.biblioteca = new LugarFueraRutaDeEscape();
		this.lugarViajes = new LugarFueraRutaDeEscape();		
	}

	public void asignarLugaresFinales()
	{
		List<Integer> listaInt = GeneradorAleatorio.generarNValoresAleatorios(3,3);

		List<Lugar> lista = new ArrayList<Lugar>();

		lista.add(new LugarCuchillazo());
		lista.add(new LugarBalazo());
		lista.add(new LugarDelSospechoso());

		this.lugarEconomia = lista.get(listaInt.get(0));
		this.biblioteca = lista.get(listaInt.get(1));
		this.lugarViajes = lista.get(listaInt.get(2));
	}

	public void asignarLugaresIntermedios(Pais paisSiguiente, String pistaSospechoso) 
	{
		Pista pistaEconomia = ConsultorPistas.obtenerPista(paisSiguiente.obtenerNombre(), "Economica");
		Pista pistaBiblioteca = ConsultorPistas.obtenerPista(paisSiguiente.obtenerNombre(), "Cultura");
		Pista pistaViajes = ConsultorPistas.obtenerPista(paisSiguiente.obtenerNombre(), "Viajes");
		
		int i =(int) (Math.random()*3);
		
		switch(i)
		{
		case 0:	pistaViajes.setearPistaSospechoso(pistaSospechoso);
				break;
				
		case 1:	pistaBiblioteca.setearPistaSospechoso(pistaSospechoso);
				break;
				
		case 2:	pistaEconomia.setearPistaSospechoso(pistaSospechoso);
				break;
		}
		pistaViajes.setearPistaSospechoso(pistaSospechoso);

		this.lugarEconomia = new LugarRutaDeEscape(pistaEconomia);
		this.lugarViajes = new LugarRutaDeEscape(pistaViajes);
		this.biblioteca = new LugarRutaDeEscape(pistaBiblioteca);		
	}
}
